package com.cykj.order.controller;

import com.cykj.common.core.web.controller.BaseController;
import com.cykj.common.core.web.domain.AjaxResult;
import com.cykj.order.domain.dto.CartInitDto;
import com.cykj.order.domain.dto.AddCartItemDto;
import com.cykj.order.domain.dto.CartItemOperationDto;
import com.cykj.order.domain.vo.CartInfoVo;

import com.cykj.order.service.ICartService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 购物车管理Controller
 * 
 * @author cykj
 * @date 2025-01-20
 */
@RestController
@RequestMapping("/cart")
public class CartController extends BaseController {
    
    @Autowired
    private ICartService cartService;
    
    /**
     * 初始化购物车
     * 进入店铺时调用，根据用户ID和店铺ID查询或创建购物车
     * 
     * @param cartInitDto 购物车初始化参数
     * @return 购物车信息（包含购物车ID和商品明细）
     */
    @PostMapping("/init")
    public AjaxResult initializeCart(@Validated @RequestBody CartInitDto cartInitDto) {
        try {
            CartInfoVo cartInfo = cartService.initializeCart(
                cartInitDto.getCustomerId(), 
                cartInitDto.getBusinessId()
            );
            return success(cartInfo);
        } catch (Exception e) {
            logger.error("初始化购物车失败", e);
            return error("初始化购物车失败: " + e.getMessage());
        }
    }
    
    /**
     * 根据用户ID和店铺ID获取购物车信息
     * 
     * @param customerId 用户ID
     * @param businessId 店铺ID
     * @return 购物车信息
     */
    @GetMapping("/info")
    public AjaxResult getCartInfo(@RequestParam Integer customerId, 
                                 @RequestParam Integer businessId) {
        try {
            CartInfoVo cartInfo = cartService.initializeCart(customerId, businessId);
            return success(cartInfo);
        } catch (Exception e) {
            logger.error("获取购物车信息失败", e);
            return error("获取购物车信息失败: " + e.getMessage());
        }
    }
    
    /**
     * 添加商品到购物车
     * 注意：此接口用于将新商品添加到购物车，数量固定为1
     * 
     * @param addCartItemDto 添加购物车商品参数
     * @return 购物车信息（包含购物车ID和商品明细）
     * 
     * 业务场景：用户浏览商品列表，点击"加入购物车"按钮
     * 注意：只有未加入购物车的商品才显示此按钮
     */
    @PostMapping("/add")
    public AjaxResult addCartItem(@Validated @RequestBody AddCartItemDto addCartItemDto) {
        try {
            CartInfoVo cartInfo = cartService.addCartItem(addCartItemDto);
            return success(cartInfo);
        } catch (Exception e) {
            logger.error("添加购物车商品失败", e);
            return error("添加购物车商品失败: " + e.getMessage());
        }
    }
    
    /**
     * 购物车商品操作（增加、减少、删除）
     * 注意：此接口仅用于操作购物车中已存在的商品
     * 
     * @param operationDto 操作参数
     * @return 购物车信息（包含购物车ID和商品明细）
     * 
     * 操作类型说明：
     * - ADD: 增加1个商品
     * - REDUCE: 减少1个商品
     * - DELETE: 删除商品
     * 
     * 业务场景：用户在购物车页面操作商品数量
     */
    @PostMapping("/operate")
    public AjaxResult operateCartItem(@Validated @RequestBody CartItemOperationDto operationDto) {
        try {
            CartInfoVo cartInfo = cartService.operateCartItem(operationDto);
            return success(cartInfo);
        } catch (Exception e) {
            logger.error("购物车商品操作失败", e);
            return error("购物车商品操作失败: " + e.getMessage());
        }
    }
    
    /**
     * 清空购物车
     * 删除购物车中的所有商品，但保留购物车本身
     * 
     * @param cartId 购物车ID
     * @return 购物车信息（包含购物车ID，商品明细为空）
     * 
     * 业务场景：用户点击"清空购物车"按钮
     */
    @PostMapping("/clear")
    public AjaxResult clearCart(@RequestParam Integer cartId) {
        try {
            CartInfoVo cartInfo = cartService.clearCart(cartId);
            return success(cartInfo);
        } catch (Exception e) {
            logger.error("清空购物车失败", e);
            return error("清空购物车失败: " + e.getMessage());
        }
    }


    /**
     * 根据用户ID获取所有购物车信息（按商家分组）
     *
     * @param customerId 用户ID
     * @return 购物车列表（每个商家一个购物车）
     */
    @GetMapping("/all")
    public AjaxResult getAllCartsByUserId(@RequestParam Integer customerId) {
        try {
            List<CartInfoVo> allCarts = cartService.getAllCartsByUserId(customerId);
            return success(allCarts);
        } catch (Exception e) {
            logger.error("获取用户所有购物车失败", e);
            return error("获取用户所有购物车失败: " + e.getMessage());
        }
    }
    



}
